#!/bin/bash

# 通用第三方库下载脚本
# 支持从config/third/*.conf配置文件自动下载第三方库
# 支持GitHub和Gitee镜像，优先使用Gitee

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $1"
}

# 项目配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
THIRD_PARTY_DIR="$PROJECT_ROOT/third"
CONFIG_DIR="$PROJECT_ROOT/config/third"

# 检查库完整性
check_library_integrity() {
    local target_dir="$1"
    local check_files="$2"
    
    # 检查目录是否存在
    if [ ! -d "$target_dir" ]; then
        return 1
    fi
    
    # 检查.git目录
    if [ ! -d "$target_dir/.git" ]; then
        return 1
    fi
    
    # 检查指定文件
    if [ -n "$check_files" ]; then
        IFS=',' read -ra FILES <<< "$check_files"
        for file in "${FILES[@]}"; do
            file=$(echo "$file" | xargs) # 去除空格
            if [ ! -f "$target_dir/$file" ]; then
                return 1
            fi
        done
    fi
    
    return 0
}

# 智能克隆函数 - 优先Gitee，失败时自动切换到GitHub
smart_clone() {
    local lib_name="$1"
    local target_dir="$2"
    local github_url="$3"
    local gitee_url="$4"
    
    # 优先尝试Gitee镜像
    if [ -n "$gitee_url" ]; then
        log_info "尝试从Gitee镜像克隆 $lib_name 库..."
        if timeout 30 git clone "$gitee_url" "$target_dir"; then
            log_info "从Gitee镜像克隆 $lib_name 成功"
            return 0
        fi
        log_warn "Gitee镜像克隆失败，尝试从GitHub克隆..."
    fi
    
    # 尝试GitHub
    if [ -n "$github_url" ]; then
        log_info "尝试从GitHub克隆 $lib_name 库..."
        if timeout 30 git clone "$github_url" "$target_dir"; then
            log_info "从GitHub克隆 $lib_name 成功"
            return 0
        fi
        log_error "GitHub克隆失败: $lib_name"
    fi
    
    log_error "所有下载源都失败: $lib_name"
    return 1
}

# 下载单个库
download_single_library() {
    local module_name="$1"
    local config_file="$2"
    
    log_info "处理库配置: $module_name"
    
    # 读取库配置
    local github_url=""
    local gitee_url=""
    local version=""
    local branch=""
    local check_files=""
    
    while IFS= read -r line; do
        # 跳过注释行和空行
        if [[ "$line" =~ ^#.*$ ]] || [[ -z "$line" ]]; then
            continue
        fi
        
        # 解析键值对
        if [[ "$line" =~ ^([^=]+)=(.*)$ ]]; then
            local key="${BASH_REMATCH[1]// /}"
            local value="${BASH_REMATCH[2]}"
            
            # 去除值两端的空格
            value=$(echo "$value" | xargs)
            
            case "$key" in
                "github_url")
                    github_url="$value"
                    ;;
                "gitee_url")
                    gitee_url="$value"
                    ;;
                "version")
                    version="$value"
                    ;;
                "branch")
                    branch="$value"
                    ;;
                "check_files")
                    check_files="$value"
                    ;;
            esac
        fi
    done < "$config_file"
    
    local target_dir="$THIRD_PARTY_DIR/$module_name"
    
    # 检查库是否已存在且完整
    if [ -d "$target_dir" ]; then
        if check_library_integrity "$target_dir" "$check_files"; then
            log_info "库 $module_name 已存在且完整，跳过下载"
            return 0
        else
            log_warn "库 $module_name 不完整，删除重新下载"
            rm -rf "$target_dir"
        fi
    fi
    
    # 智能克隆
    if ! smart_clone "$module_name" "$target_dir" "$github_url" "$gitee_url"; then
        return 1
    fi
    
    # 切换到指定版本
    if [ -n "$version" ] && [ "$version" != "latest" ]; then
        cd "$target_dir"
        if git checkout "$version" 2>/dev/null; then
            log_info "切换到版本 $version 成功"
        else
            log_warn "切换到版本 $version 失败，使用默认分支"
        fi
        cd - > /dev/null
    fi
    
    return 0
}

# 下载指定模块
download_specific_module() {
    local module_name="$1"
    local config_file="$CONFIG_DIR/$module_name.conf"
    
    if [ ! -f "$config_file" ]; then
        log_error "配置文件不存在: $config_file"
        log_info "可用的模块:"
        if [ -d "$CONFIG_DIR" ]; then
            for conf in "$CONFIG_DIR"/*.conf; do
                if [ -f "$conf" ]; then
                    echo "  - $(basename "$conf" .conf)"
                fi
            done
        fi
        exit 1
    fi
    
    download_single_library "$module_name" "$config_file"
}

# 下载所有模块
download_all_modules() {
    if [ ! -d "$CONFIG_DIR" ]; then
        log_error "配置目录不存在: $CONFIG_DIR"
        exit 1
    fi
    
    local success_count=0
    local total_count=0
    
    for config_file in "$CONFIG_DIR"/*.conf; do
        if [ -f "$config_file" ]; then
            local module_name=$(basename "$config_file" .conf)
            total_count=$((total_count + 1))
            
            if download_single_library "$module_name" "$config_file"; then
                success_count=$((success_count + 1))
            fi
        fi
    done
    
    log_info "下载完成: $success_count/$total_count 个库成功"
    
    if [ $success_count -eq $total_count ]; then
        return 0
    else
        return 1
    fi
}

# 显示帮助信息
show_help() {
    echo "通用第三方库下载脚本"
    echo
    echo "用法:"
    echo "  $0                    # 下载所有配置的第三方库"
    echo "  $0 <模块名>           # 下载指定模块"
    echo "  $0 -h, --help        # 显示帮助信息"
    echo
    echo "配置文件位置: $CONFIG_DIR"
    echo "下载目录: $THIRD_PARTY_DIR"
    echo
    echo "添加新的第三方库:"
    echo "  1. 在 $CONFIG_DIR 目录下创建 <模块名>.conf 文件"
    echo "  2. 配置文件格式:"
    echo "     github_url = https://github.com/user/repo.git"
    echo "     gitee_url = https://gitee.com/mirrors/repo.git"
    echo "     version = v1.0.0"
    echo "     branch = master"
    echo "     check_files = file1.h,file2.c"
    echo
    echo "特性:"
    echo "  - 优先使用Gitee镜像，提高国内下载速度"
    echo "  - 自动完整性检查，避免重复下载"
    echo "  - 支持版本切换和分支选择"
    echo "  - 30秒超时保护，避免网络问题导致卡死"
}

# 主函数
main() {
    # 检查参数
    if [ $# -eq 0 ]; then
        # 无参数，下载所有模块
        download_all_modules
    elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
        show_help
    else
        # 下载指定模块
        download_specific_module "$1"
    fi
}

# 执行主函数
main "$@"